import axios from "axios";

// 开发环境       测试环境        生产环境
// localhost,ip  npm run build  npm run build
// development    production
// process.env 是node中返回环境的对象
// NODE_ENV 是 webpack 进行设置的
const isDev = process.env.NODE_ENV == 'development'

// 自定义 axios
const request = axios.create({
  // 如果遇到跨域问题，可以在 package.json 中解决
  // "proxy": "http://121.89.205.189:3001/admin"
  // baseURL 以后我们调用接口可以不用在写，程序会自动帮我们拼接好
  baseURL:"http://localhost:3001/admin",
  timeout: 6000 // 请求的超时时间
})

// 请求拦截器
request.interceptors.request.use(config => {
    // 比如登录的验证 -- token
    config.headers.token = localStorage.getItem('token') || ''
    return config
}, error => {
    return Promise.reject(error)
})

// 响应拦截器
request.interceptors.response.use(response => {
    if (response.data.code == '10119') {
        // 登录无效
        localStorage.setItem('loginState', false)
            // window.location.href = '/login' // BrowserRouter 路由
            // window.location.href = '/#/login' // HashRouter
    }
    return response.data
}, error => {
    return Promise.reject(error)
})


// 自定义各种请求数据 axios
export default function ajax(config) {
    // 1. 先获取到请求的一些必要配置
    const { method = 'GET', url = '', data = {}, headers = {} } = config

    // 2. 判断我们的请求类型
    switch (method.toUpperCase()) {
        case 'GET':
            return request.get(url, { params: data })
        case 'POST':
            // 1. 表单数据
            if (headers['content-type'] == 'application/x-www-form-url-encoded') {
                // 也可以通过 qs js库解决该问题
                // 转换参数类型，格式化数据
                const obj = new URLSearchParams()
                for (const key in data) {
                    obj.append(key, data[key])
                }
                return request.post(url, obj, { headers })
            }
            // 2. 文件数据
            if (headers['content-type'] == 'multipart/form-data') {
                // 转换参数类型，格式化数据
                const obj = new FormData()
                for (const key in data) {
                    obj.append(key, data[key])
                }
                return request.post(url, obj, { headers })
            }
            // 3. 默认提交数据(json对象) 
            return request.post(url, data)
        case 'PUT':
            // 修改数据 --  数据的更新
            return request.put(url, data)
        case 'DELETE':
            // 删除数据 
            return request.delete(url, { data })
        case 'PATCH':
            // 更新局部资源 
            return request.patch(url, data)
        default:
            return request(config)
    }
}